쿠키와 세션

HTTPstatelessconnectionless 라는 특징을 가진다.

HTTP는 단순한 하이퍼 미디어를 교환하기 위해 간단하게 설계되었지만, 웹이 발전하면서 사용자의 상태를 저장하고 기억할 필요가 있어졌다.
예를 들면, 웹사이트에서 로그인을 하면 다른 페이지로 이동해도 그대로 로그인이 되어 았어야 서비스를 이용하는데 문제가 없다.
HTTP의 무상태성에도 불구하고 어떻게 사용자를 기억하는게 가능할까?

해답은 쿠키와 세션에 있다.

쿠키

쿠키란?

웹 브라우저에 저장되는 작은 데이터 조각으로, 사용자의 컴퓨터에 저장되어 웹사이트와 브라우저 간의 상태를 유지하고 정보를 기억하는 데 사용된다.

즉, 서버에서 클라이언트에 상태정보를 시키는 거라고 이해하면 쉽다.

아래는 로그인 정보를 cookie에 저장할 때의 작동과정이다.
Attachments/Picture/Pasted image 20231218154319.png|400
로그인 요청시에 서버에서는 해당 유저에 대한 정보를 브라우저가 저장해놨다가 서버 재요청시에 이를 동봉하게 한다.

위에서 예시로 들은 session(로그인) 관리 외에 개인화 및 사용자 행동을 기록하고 추적하는 트래킹에도 사용될 수 있다.

쿠키 만들기

서버는 HTTP의 응답에 Set-Cookie 헤더를 설정하여 쿠키를 생성시킬 수 있다.

Set-Cookie: <cookie-name>=<cookie-value>

key와 value 쌍으로 쿠키를 설정할 수 있다.

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

쿠키의 문제점.

과거에는 클라리언트 측에 데이터를 저장하는 유일한 방법이 쿠키였지만 지금은 다른 대안책도 많다.
쿠키는 요청마다 헤더에 실리기 때문에 데이터 저장용으로 사용하기에는 비효율적이다.
이 때에는 web storage api나 IndexedDB를 사용하는 편이 좋다.

세션

세션이란

웹 어플리케이션에서 사용자의 상태를 유지하고 정보를 저장되는 데 사용되는 시스템 중 하나.

쉽게 얘기해서 사용자의 정보를 서버에 저장하는 방식을 말한다.
session의 도입으로 쿠키에서 발생할 수 있는 문제점들을 다수 해결할 수 있다.

결국 세션도 사용자를 구분할 수 있어야하는데 어떻게 한다는 걸까?
Attachments/Picture/Pasted image 20231218172830.png|500
서버에서 접속한 사용자를 여러가지 방법으로 (db, inmemory 등) 저장해두고 이를 구분할 수 있는 ID로 발급하여서 이를 클라이언트에게 cookie로 보내여 사용한다.
이후 사용자의 요청 header에 있는 session id로 사용자를 구분할 수 있다.

sessionId key

쿠키에 sessionId를 저장할 때 key값으로 SESSIONID 가 많이 사용되지만 시스템마다, 서버의 설정마다 상이하다.
예를들어 node.js는 connect.sid 라는 key값을 사용한다.

세션 정보 저장

서버에서 session 정보를 저장한다는 말은 filesystem을 사용한다는 말이다. 어떤 시스템을 사용할 지는 구축하려는 요구사항에 따라서 달라질 수 있다.
session storage로 사용될 수 있는 방식들을 비교하여 보자.

In memory

별도의 시스템을 사용하지 않고 생성된 세션 데이터는 서버의 메모리에 저장된다.
memory에 저장되는 것은 disk 혹은 database 기반의 세션에 비해서 빠르다.
Attachments/Picture/Pasted image 20231218180801.png|500
간단하지만 몇가지 발생할 수 있는 문제점이 있다.

DB

RDBMS나 NoSQL DB를 사용하여 세션 데이터를 저장할 수 있다.
세션 데이터를 영구적으로 보존할 수 있고, 여러 서버간에 세션을 공유할 수도 있다.
하지만 속도가 느리다.

In memory store

외부 메모리 저장소인 Redis, Memcached 등을 사용할 수 있다.
높은 성능과 확장성, 세션 불일치 문제등을 해결할 수 있기 때문에 많이 사용한다.

reference